#ifndef __SE_SINGLETON_HPP__
#define __SE_SINGLETON_HPP__

namespace se {

// 单例基类，T为Singleton的派生类  --- 奇异递归
template <typename T>
class Singleton {
public:
    /**
     * @brief Get the Instance object
     * @return T& 单例对象的引用
     */
    static T &getInstance() {
        static T instance;  // 静态局部变量，可以同时做到线程安全和自动析构
        return instance;
    }

    Singleton(const Singleton &) = delete;
    Singleton &operator=(const Singleton &) = delete;
private:
    Singleton() = default;
    virtual ~Singleton() { }
    friend T;  // 将派生类设为友元，使得派生类可以访问基类构造函数同时防止其他派生类胡乱继承
};

}  // namespace se

#endif
